package es.gesfutbol.web;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.criterion.Order;
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import es.gesfutbol.dao.IEquipDao;
import es.gesfutbol.dao.IEquipEnLligaDao;
import es.gesfutbol.dao.IEstadiDao;
import es.gesfutbol.dao.IJornadaDao;
import es.gesfutbol.dao.ILligaDao;
import es.gesfutbol.dao.IPartitDao;
import es.gesfutbol.domini.implementacio.Equip;
import es.gesfutbol.domini.implementacio.EquipEnLliga;
import es.gesfutbol.domini.implementacio.Estadi;
import es.gesfutbol.domini.implementacio.Jornada;
import es.gesfutbol.domini.implementacio.Lliga;
import es.gesfutbol.domini.implementacio.Partit;
import es.gesfutbol.util.OrdenaEquipsPerNom;
import es.gesfutbol.util.OrdenaEstadisPerNom;
import es.gesfutbol.util.OrdenaPartitPerId;

public class PartitController extends MultiActionController{

	private IJornadaDao jornadaDao;
	private ILligaDao lligaDao;
	private IEquipDao equipDao;
	private IEstadiDao estadiDao;
	private IPartitDao partitDao;
	private IEquipEnLligaDao equipEnLligaDao;

	public IJornadaDao getJornadaDao() {
		return jornadaDao;
	}

	public void setJornadaDao(IJornadaDao jornadaDao) {
		this.jornadaDao = jornadaDao;
	}
	
	public ILligaDao getLligaDao() {
		return lligaDao;
	}

	public void setLligaDao(ILligaDao lligaDao) {
		this.lligaDao = lligaDao;
	}
	
	public IEquipDao getEquipDao() {
		return equipDao;
	}

	public void setEquipDao(IEquipDao equipDao) {
		this.equipDao = equipDao;
	}
	
	public IEstadiDao getEstadiDao() {
		return estadiDao;
	}

	public void setEstadiDao(IEstadiDao estadiDao) {
		this.estadiDao = estadiDao;
	}
	
	public IPartitDao getPartitDao() {
		return partitDao;
	}

	public void setPartitDao(IPartitDao partitDao) {
		this.partitDao =partitDao;
	}
	
	public IEquipEnLligaDao getEquipEnLligaDao() {
		return equipEnLligaDao;
	}

	public void setEquipEnLligaDao(IEquipEnLligaDao equipEnLligaDao) {
		this.equipEnLligaDao = equipEnLligaDao;
	}
	

	
	public ModelAndView viewUpdate(HttpServletRequest request,
			HttpServletResponse response){
		
		List<Lliga> lligues = lligaDao.findAll();
		List<Jornada> jornades = jornadaDao.findAll();
		List<Equip> equips = equipDao.findAll(Order.asc("nom"));
		List<Estadi> estadis = estadiDao.findAll(Order.asc("nom"));
		
		Long idLliga = Long.parseLong(request.getParameter("idLliga"));
		Lliga lligaActual = lligaDao.findById(idLliga);
		lligaActual = lligaDao.deproxy(lligaActual);
		
		Long idJornada = Long.parseLong(request.getParameter("idJornada"));
		Jornada jornadaActual = jornadaDao.findById(idJornada);
		jornadaActual = jornadaDao.deproxy(jornadaActual);
		
		Long idPartit = Long.parseLong(request.getParameter("idPartit"));
		Partit partit = partitDao.findById(idPartit);		
		
		Partit nouPartit = new Partit();
		nouPartit = partitDao.deproxy(nouPartit);
		nouPartit.setIdPartit(idPartit);
		
		Set<Partit> partits = new HashSet<Partit>();
		partits.add(partit);
		partits = partitDao.deproxylist(partits);
		
		Equip nouEquipLocal = new Equip();
		Equip nouEquipVisitant = new Equip();
		Estadi nouEstadi = new Estadi();
		
		jornadaActual.setLliga(lligaActual);		
		nouPartit.setJornada(jornadaActual);
		nouPartit.setEquipLocal(nouEquipLocal);
		nouPartit.setEquipVisitant(nouEquipVisitant);
		nouPartit.setEstadi(nouEstadi);
		
		ModelMap model = new ModelMap();
		model.put("lligaActual", lligaActual);
		model.put("llistatLligues", lligues);
		model.put("llistatJornades", jornades);
		model.put("jornadaActual", jornadaActual);
		model.put("partit", nouPartit);
		model.put("llistatPartits", partits);
		model.put("llistatEquips", equips);
		model.put("llistatEstadis", estadis);
		return new ModelAndView("administracion/partits", model);
	}
	
	public ModelAndView viewPartitsJornadaLliga(HttpServletRequest request,
	HttpServletResponse response){
		
		List<Lliga> lligues = lligaDao.findAll();
		List<Jornada> jornades = jornadaDao.findAll();
		//List<Equip> equips = equipDao.findAll(Order.asc("nom"));
		//List<Estadi> estadis = estadiDao.findAll(Order.asc("nom"));
		
		Long idLliga = Long.parseLong(request.getParameter("idLliga"));
		Lliga lligaActual = lligaDao.findById(idLliga);
		lligaActual = lligaDao.deproxy(lligaActual);
		
		List<EquipEnLliga> equipsEnLliga = equipEnLligaDao.findByIdLligaDeproxy(idLliga);
		
		List<Equip> equips = new ArrayList<Equip>();
		List<Estadi> estadis = new ArrayList<Estadi>();
		
		Iterator<EquipEnLliga> it = equipsEnLliga.iterator();
		while (it.hasNext()) {
			Equip equip = it.next().getId().getEquip();
			equip = equipDao.deproxy(equip);		
			equips.add(equip);
			estadis.add(equip.getEstadi());
		}
		if(equipsEnLliga != null) {
			Collections.sort(equips, new OrdenaEquipsPerNom());
			Collections.sort(estadis, new OrdenaEstadisPerNom());
		}		
				
		Long idJornada = Long.parseLong(request.getParameter("idJornada"));
		Jornada jornadaActual = jornadaDao.findById(idJornada);
		jornadaActual = jornadaDao.deproxy(jornadaActual);
		
		Partit nouPartit = new Partit();
		nouPartit = partitDao.deproxy(nouPartit);
		
		Set<Partit> partits = jornadaActual.getPartits();
		partits = partitDao.deproxylist(partits);
		List<Partit> lPartits = new ArrayList<Partit>(partits);
		Collections.sort(lPartits, new OrdenaPartitPerId());
		
		Equip nouEquipLocal = new Equip();
		Equip nouEquipVisitant = new Equip();
		Estadi nouEstadi = new Estadi();
		
		jornadaActual.setLliga(lligaActual);		
		nouPartit.setJornada(jornadaActual);
		nouPartit.setEquipLocal(nouEquipLocal);
		nouPartit.setEquipVisitant(nouEquipVisitant);
		nouPartit.setEstadi(nouEstadi);
				
		ModelMap modelMap = new ModelMap();
		modelMap.put("lligaActual", lligaActual);
		modelMap.put("llistatLligues", lligues);		
		modelMap.put("jornadaActual", jornadaActual);
		modelMap.put("llistatJornades", jornades);
		modelMap.put("partit", nouPartit);
		modelMap.put("llistatPartits", lPartits);
		modelMap.put("llistatEquips", equips);
		modelMap.put("llistatEstadis", estadis);
		return new ModelAndView("administracion/partits", modelMap);		
	}
	
	public ModelAndView addOrUpdate(HttpServletRequest request,
			HttpServletResponse response, Partit partit){
		
		Long idEquipLocal = partit.getEquipLocal().getIdEquip();
		Long idEquipVisitant = partit.getEquipVisitant().getIdEquip();
		
		Equip equipLocal = equipDao.findById(idEquipLocal);
		Equip equipVisitant = equipDao.findById(idEquipVisitant);
		
		String local = equipLocal.getNom();
		String visitant = equipVisitant.getNom();
		String nomPartit = local.concat(" - ");
		nomPartit = nomPartit.concat(visitant);
		partit.setNomPartit(nomPartit);
		
			
		//***********Parsear dates**********************
		
//		String dia = request.getParameter("dia");
//		String mes = request.getParameter("mes");
//		String any = request.getParameter("any");
//		String stringDate = any + "/" + mes + "/" + dia;
//		
//		SimpleDateFormat format =
//            new SimpleDateFormat("yyyy/MM/dd");
//		try {
//			Date data = format.parse(stringDate);
//			partit.setData(data);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
		//**********************************************	
		Long idJornada = Long.parseLong(request.getParameter("idJornada"));
		Jornada jornadaActual = jornadaDao.findById(idJornada);
		jornadaActual = jornadaDao.deproxy(jornadaActual);
		
		partit.setJornada(jornadaActual);
		
		partitDao.save(partit);
		
		
		Lliga lliga = new Lliga();
		lliga = jornadaActual.getLliga();
		Long idLliga = lliga.getIdLliga();
		
		lliga = lligaDao.findById(idLliga);
		
		idLliga = lliga.getIdLliga();
		idJornada = jornadaActual.getIdJornada();
		
		String sLliga= idLliga.toString();
		String sJornada = idJornada.toString();
		String sURL1 = "redirect:viewPartitsJornadaLliga.htm?idLliga=";
		String sURL2 = "&idJornada=";
		
		sURL1 = sURL1.concat(sLliga);
		sURL2 = sURL2.concat(sJornada);
		
		
		String redirect= sURL1.concat(sURL2);

		return new ModelAndView(redirect);
	}
	
	/**
	 * Mètode que elimina una lliga de la bbdd.
	 * 
	 * @param request
	 * @param response
	 * @return
	 */
	public ModelAndView delete(HttpServletRequest request,
			HttpServletResponse response){
		
		Long idJornada = Long.parseLong(request.getParameter("idJornada"));
		Long idLliga = Long.parseLong(request.getParameter("idLliga"));
		Long idPartit = Long.parseLong(request.getParameter("idPartit"));
		partitDao.delete(idPartit);
		
		String sLliga= idLliga.toString();
		String sJornada = idJornada.toString();
		String sURL1 = "redirect:viewPartitsJornadaLliga.htm?idLliga=";
		String sURL2 = "&idJornada=";
		
		sURL1 = sURL1.concat(sLliga);
		sURL2 = sURL2.concat(sJornada);
				
		String redirect= sURL1.concat(sURL2);

		return new ModelAndView(redirect);
	}	
}
